<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=
    , initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    //常量 const  不可以重复定义赋值 但是如果是一个对象的话 属性是可变的 
    // const person = {
    //     name:'收购腾讯',
    //     age:'5元'
    // }
    // //如果你想要一个不可变的单例对象 
    // const person = {
    //     name:'收购腾讯',
    //     age:'5元'
    // }
    // Object.freeze(person);   //这样就不能新增或修改person的任何属性  

    //常量冻结 
    const esObj = {         //这里是一个对象
        name:"es6",
        year:2015
    }
    //Object.freeze(esObj);  //加上这一句 则下面的log{name:"es6",year:2015}
    esObj.name ="es2015";
    console.log(esObj)       //{name:"es2015", year:2015}

    const arr = ['es6','es7','es8'];   //这是一个数组 
    //Object.freeze(arr)     //冻结
    arr[0] = 'es2015'
    console.log(arr)         //["es2015","es7","es8"]
    /*
     上面的代码说明 对象和数组 这类引用数据类型 因为在栈内存中存的引用地址 所以其堆内存中的内容是会被改变的 
     若不想被改变 加 freeze()方法冻结 
    */
   const esObj ={
    name:"es6",
    year:'2015',
    extension:["es7","es8","es9"]
   }
   Object.freeze(esObj);
   esObj.extension[0] = "es2016"
   console.log(esObj)
   /*
   {name: "es6", year: "2015", extension: Array(3)}
    extension: Array(3)
    0: "es2016"
    1: "es8"
    2: "es9"
   */
   //说明freeze的冻结只是 浅层次的 内部的数组还是会改变 这！！！ 
   //看下面封装一下函数  定义一个myFreeze
   function myFreeze(obj){
       Object.freeze(obj);
       Object.keys(Obj).forEach(function(key){  //Object.keys()方法会返回一个当前对象属性所组成的数组
           if(typeof obj[key] === "object"){    //如果key对应的属性的值是一个对象的话
            myFreeze(obj[key])                  //那么再次冻结 递归 再次执行 
           }
       })
   }

</script>
 